//-----------------------------------------------------------------------------
//
//	Demonstração de como usar a biblioteca AGUA
//
//	Esse programa faz basicamente o seguinte:
//		Inicia a AGUA e monta o servidor ou o cliente.
//		O cliente fica em loop esperando chegada de dados do servidor e
//		quando eles chegam, ele se atualiza.
//		O servidor pode ver os dados que possue, alterá-los ou enviá-los
//		para os clientes.
//
//	Compilar: g++ -o Gota gota.cpp agua.cpp listaC.cpp -lSDL_net
//		Esse código só foi testado no Linux.
//
//	Usar: Compile e abra pelo terminal o compilado "Gota".
//		Escolha seu nome e monte o servidor.
//		Abra por outro terminal o "Gota" e monte um cliente.
//		Conecte esse cliente ao servidor recém aberto com o IP: localhost
//		ou, caso o servidor esteja em outra máquina coloque o IP dela.
//		Agora, pelo servidor, altere os dados e envie aos clientes.
//		Observe que o cliente irá receber os dados.
//
//-----------------------------------------------------------------------------

#include "agua.h"
#include <iostream>

char Porta[6] = {"20000"};	// Porta de comunicação usada (deve ser a mesma para o cliente e servidor)
char Nome[20] = {};			// Seu nome
char Ip[20] = {};			// IP do servidor (Caso queira conectar com um
							// servidor na própria máquina o IP será:
							// "localhost" ou "127.0.0.1")

// Esse é um exemplo de pacote para ser enviado pela rede
typedef struct{
	char caracter;
	int numero;
} um_pacote;

//-----------------------------------------------------------------------------
// Essa é a função rodada pelo cliente
int receptor_de_dados()
{
	int O_Numero = 0;
	char O_Caracter = '0';
	
	// Esse pacote será usado para interpretar oq chegou pela rede
	um_pacote *O_Pacote;
	
	// Esse objeto será usado para receber oq chegou pela rede
	void *objeto = NULL;
	
	while(1)
	{
		// Verifica se há um pacote novo no canal 1
		if( AGUA_abrir_pacote( 1, AGUA_PRIMEIRA, &objeto ) )
		{
			printf("O enviador de dados mandou um novo pacote!\n");
			printf("Atualizando 'O numero' e 'O caracter'\n");
			
			// Interpreta oq chegou pela rede como um "um_pacote"
			O_Pacote = (um_pacote*)objeto;
			
			// Obtém os dados desse pacote
			O_Numero = O_Pacote->numero;
			O_Caracter = O_Pacote->caracter;
			
			printf("O_Numero: %d\n",O_Numero);
			printf("O_Caracter: %c\n",O_Caracter);
			
			// Deleta o pacote aberto
			AGUA_remover_pacote();
		}
	}
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Essa é a função rodada pelo servidor
int enviador_de_dados()
{
	int O_Numero = 0;
	char O_Caracter = '0';
	
	int opcao;
	
	um_pacote O_Pacote;
	
	while(1)
	{
		printf("O que vc, o enviador de dados, deseja fazer?\n");
		printf("Ver dados atuais (1), Alterar dados (2) ou\n");
		printf("Enviar dados (3)?\n");
		
		scanf("%d",&opcao);
		
		if( opcao == 1 )
		{	
			printf("O_Numero: %d\n",O_Numero);
			printf("O_Caracter: %c\n",O_Caracter);
		}
		else if( opcao == 2 )
		{
			printf("Qual o novo valor para O Numero?\n");
			scanf("%d",&O_Numero);
			printf("Qual o novo valor para O Caracter?\n");
			scanf("%s\0",&O_Caracter);
		}
		else if( opcao == 3 )
		{
			O_Pacote.numero = O_Numero;
			O_Pacote.caracter = O_Caracter;
			
			// Manda pelo canal 1 um O_Pacote para todos os clientes 
			AGUA_mandar_pacote( 1, sizeof(um_pacote), &O_Pacote, -2 );
			
			printf("Dados enviados\n");
		}
	}
}
//-----------------------------------------------------------------------------

int main()
{
	int opcao; // Para conversar com o usuário
	
	
	// Abre 2 canais, o 1 e o 0 e não carrega o chat
	AGUA_encher( 2, AGUA_SEM_CHAT );
	
	printf("Qual seu nome?\n");
	scanf("%s",Nome);

	printf("Voce sera um servidor (1) ou um cliente (2)?\n");
	scanf("%d",&opcao);
	
	// Caso servidor
	if( opcao == 1 ) {
		
		// Abre o servidor
		AGUA_iniciar_servidor(Porta,Nome);
		
		// Aguarda o servidor iniciar
		while(!AGUA_Rede_Ativa){}
		
		// Roda a função desejada
		enviador_de_dados();
	}
	// Caso cliente
	else if( opcao == 2 ) {
		
		// Recebe o IP
		printf("Qual o IP do servidor?\n");
		scanf("%s",Ip);
		
		// Conecta o cliente
		AGUA_iniciar_cliente(Ip,Porta,Nome);
		
		// Roda a função desejada
		receptor_de_dados();
	}

	AGUA_secar( -1 );
}
